<?php
/**
 * 融云server API 接口 新版 1.0
 * @author aiqing
 * @date    2014-12-10  15:30
 * @modify  2015-02-02  10:21
 */

class IM {
	
	private $appKey;	//appKey
	private $appSecret;		//appSecret
	const SERVERAPIURL = 'https://api.cn.rong.io';		//请求服务地址
	private $format;	//数据格式 json/xml
	
	/**
	 * 参数初始化
	 * @param $appKey
	 * @param $appSecret
	 * @param $format
	 */
	public function __construct($appKey,$appSecret,$format = 'json'){
		$this->appKey = $appKey;
		$this->appSecret = $appSecret;
		$this->format = $format;
	}
	

	/**
	 * 获取 Token 方法
	 * @param $userId 用户 Id，最大长度 32 字节。是用户在 App 中的唯一标识码，必须保证在同一个 App 内不重复，重复的用户 Id 将被当作是同一用户。
	 * @param $name 用户名称，最大长度 128 字节。用来在 Push 推送时，或者客户端没有提供用户信息时，显示用户的名称。
	 * @param $portraitUri 用户头像 URI，最大长度 1024 字节。
	 */
	public function getToken($userId, $name, $portraitUri){
		try {
			if(empty($userId))
				throw new Exception('用户Id不能为空');
			if(empty($name))
				throw new Exception('用户名称不能为空');
			if(empty($portraitUri))
				$portraitUri = 'http://irun.hupu.com/static/images/default.png';
			$ret = $this->curl('/user/getToken',array('userId'=>$userId, 'name'=>$name, 'portraitUri'=> $portraitUri));
			if(empty($ret))
				throw new Exception('请求失败');
			return $ret;
				
		} catch (Exception $e) {
			//print_r($e->getMessage());
			return false;
		}
	}
	
	/**
	 * 发送会话消息 
	 * @param $fromUserId 发送人用户 Id。（必传）
	 * @param $toUserId	接收用户 Id，提供多个本参数可以实现向多人发送消息。（必传）
	 * @param $objectName 消息类型，参考融云消息类型表.消息标志；可自定义消息类型。（必传）
	 * @param $content 发送消息内容，参考融云消息类型表.示例说明；如果 objectName 为自定义消息类型，该参数可自定义格式。（必传）
	 * @param $pushContent 如果为自定义消息，定义显示的 Push 内容。(可选)
	 * @param $pushData 针对 iOS 平台，Push 通知附加的 payload 字段，字段名为 appData。(可选)
	 */
	public function messagePublish($fromUserId, $toUserId = array(), $objectName, $content, $pushContent='', $pushData = ''){
		try {
			if(empty($fromUserId))
				throw new Exception('发送人用户Id不能为空');
		
			if(empty($toUserId))
				throw new Exception('接收用户Id不能为空');
		
			if(empty($objectName))
				throw new Exception('消息类型不能为空');
		
			if(empty($content))
				throw new Exception('发送消息内容不能为空');
		
			$params = array(
					'fromUserId' => $fromUserId,
					'objectName' => $objectName,
					'content' => $content,
					'pushContent' => $pushContent,
					'pushData' => $pushData
			);
		
			$paramsString = http_build_query($params);
		
			foreach ($toUserId as $val){
				$paramsString .= "&toUserId=" . $val;
			}
		
			$ret = $this->curl('/message/publish',$paramsString);
		
			if(empty($ret))
				throw new Exception('请求失败');
		
			return $ret;
		} catch (Exception $e) {
			//print_r($e->getMessage());
			return false;
		}
	}
	
	/**
	 * 以一个用户身份向群组发送消息
	 * @param $fromUserId 发送人用户 Id。（必传）
	 * @param $toGroupId 接收群Id，提供多个本参数可以实现向多群发送消息。（必传）
	 * @param $objectName 消息类型，参考融云消息类型表.消息标志；可自定义消息类型。（必传）
	 * @param $content 发送消息内容，参考融云消息类型表.示例说明；如果 objectName 为自定义消息类型，该参数可自定义格式。（必传）
	 * @param $pushContent 如果为自定义消息，定义显示的 Push 内容。(可选)
	 * @param $pushData 针对 iOS 平台，Push 通知附加的 payload 字段，字段名为 appData。(可选)
	 */
	public function messageGroupPublish($fromUserId, $toGroupId = array(), $objectName, $content, $pushContent = '', $pushData = ''){
		try {
			if(empty($fromUserId))
				throw new Exception('发送人用户Id不能为空');
		
			if(empty($toGroupId))
				throw new Exception('接收群Id不能为空');
		
			if(empty($objectName))
				throw new Exception('消息类型不能为空');
		
			if(empty($content))
				throw new Exception('发送消息内容不能为空');
		
			$params = array(
					'fromUserId' => $fromUserId,
					'objectName' => $objectName,
					'content' => $content,
					'pushContent' => $pushContent,
					'pushData' => $pushData
			);
		
			$paramsString = http_build_query($params);
		
			foreach ($toGroupId as $val){
				$paramsString .= "&toGroupId=" . $val;
			}
		
			$ret = $this->curl('/message/group/publish',$paramsString);
		
			if(empty($ret))
				throw new Exception('请求失败');
		
			return $ret;
		} catch (Exception $e) {
			//print_r($e->getMessage());
			return false;
		}
	}
	
	
	/**
	 * 一个用户向聊天室发送消息
	 * @param $fromUserId 发送人用户 Id。（必传）
	 * @param $toChatroomId 接收聊天室Id，提供多个本参数可以实现向多个聊天室发送消息。（必传）
	 * @param $objectName 消息类型，参考融云消息类型表.消息标志；可自定义消息类型。（必传）
	 * @param $content 发送消息内容，参考融云消息类型表.示例说明；如果 objectName 为自定义消息类型，该参数可自定义格式。（必传）
	 */
	public function messageChatroomPublish($fromUserId, $toChatroomId = array(), $objectName, $content){
		try {
			if(empty($fromUserId))
				throw new Exception('发送人用户Id不能为空');
		
			if(empty($toChatroomId))
				throw new Exception('接收聊天室Id不能为空');
				
			if(empty($objectName))
				throw new Exception('消息类型不能为空');
				
			if(empty($content))
				throw new Exception('发送消息内容不能为空');
		
			$params = array(
				'fromUserId' => $fromUserId,
				'objectName' => $objectName,
				'content' => $content
			);
				
			$paramsString = http_build_query($params);
				
			foreach ($toChatroomId as $val){
				$paramsString .= "&toChatroomId=" . $val;
			}
				
			$ret = $this->curl('/message/chatroom/publish',$paramsString);
		
			if(empty($ret))
				throw new Exception('请求失败');
		
			return $ret;
		} catch (Exception $e) {
			//print_r($e->getMessage());
			return false;
		}
	}
	
	/**
	 * 一个用户向一个或多个用户发送系统消息
	 * @param $fromUserId 发送人用户 Id。（必传）
	 * @param $toUserId 接收用户Id，提供多个本参数可以实现向多用户发送系统消息。（必传）
	 * @param $objectName 消息类型，参考融云消息类型表.消息标志；可自定义消息类型。（必传）
	 * @param $content 发送消息内容，参考融云消息类型表.示例说明；如果 objectName 为自定义消息类型，该参数可自定义格式。（必传）
	 * @param $pushContent 如果为自定义消息，定义显示的 Push 内容。(可选)
	 * @param $pushData 针对 iOS 平台，Push 通知附加的 payload 字段，字段名为 appData。(可选)
	 */
	public function messageSystemPublish($fromUserId, $toUserId = array(), $objectName, $content, $pushContent='', $pushData = ''){
		try {
			if(empty($fromUserId))
				throw new Exception('发送人用户Id不能为空');
				
			if(empty($toUserId))
				throw new Exception('接收用户Id不能为空');
			
			if(empty($objectName))
				throw new Exception('消息类型不能为空');
			
			if(empty($content))
				throw new Exception('发送消息内容不能为空');
		
			$params = array(
				'fromUserId' => $fromUserId,
				'toUserId' => $toUserId,
				'objectName' => $objectName,
				'content' => $content,
				'pushContent' => $pushContent,
				'pushData' => $pushData
			);
			
			$paramsString = http_build_query($params);
			
			foreach ($toUserId as $val){
				$paramsString .= "&toUserId=" . $val;
			}
			
			$ret = $this->curl('/message/system/publish',$paramsString);
				
			if(empty($ret))
				throw new Exception('请求失败');
				
			return $ret;
		} catch (Exception $e) {
			//print_r($e->getMessage());
			return false;
		}
	}
	
	/**
	 * 某发送消息给一个应用下的所有注册用户。
	 * @param $fromUserId 发送人用户 Id。（必传）
	 * @param $objectName 消息类型，参考融云消息类型表.消息标志；可自定义消息类型。（必传）
	 * @param $content 发送消息内容，参考融云消息类型表.示例说明；如果 objectName 为自定义消息类型，该参数可自定义格式。（必传）
	 */
	public function messageBroadcast($fromUserId, $objectName, $content){
		try {
			if(empty($fromUserId))
				throw new Exception('发送人用户Id不能为空');
				
			if(empty($objectName))
				throw new Exception('消息类型不能为空');
			
			if(empty($content))
				throw new Exception('发送消息内容不能为空');
		
			$ret = $this->curl('/message/broadcast',array('fromUserId'=>$fromUserId, 'objectName'=>$objectName, 'content'=> $content));
				
			if(empty($ret))
				throw new Exception('请求失败');
				
			return $ret;
		} catch (Exception $e) {
			//print_r($e->getMessage());
			return false;
		}
	}
	
	/**
	 * 获取 APP 内指定某天某小时内的所有会话消息记录的下载地址
	 * @param $data 指定北京时间某天某小时，格式为：2014010101,表示：2014年1月1日凌晨1点。（必传）
	 */
	public function messageHistory($date){
		try {
			if(empty($date))
				throw new Exception('时间不能为空');
				
			$ret = $this->curl('/message/history',array('date'=>$date));
				
			if(empty($ret))
				throw new Exception('请求失败');
				
			return $ret;
		} catch (Exception $e) {
			//print_r($e->getMessage());
			return false;
		}
	}
	
	/**
	 * 删除 APP 内指定某天某小时内的所有会话消息记录
	 * @param $date string 指定北京时间某天某小时，格式为2014010101,表示：2014年1月1日凌晨1点。（必传）
	 */
	public function messageHistoryDelete($date){
		try {
			if(empty($date))
				throw new Exception('时间不能为空');
				
			$ret = $this->curl('/message/history/delete',array('date'=>$date));
				
			if(empty($ret))
				throw new Exception('请求失败');
				
			return $ret;
		} catch (Exception $e) {
			//print_r($e->getMessage());
			return false;
		}
	}
	
	/**
	 * 向融云服务器提交 userId 对应的用户当前所加入的所有群组。
	 * @param $groupId 被同步群信息的用户Id。（必传）
	 * @param $groupName 该用户的群信息。（必传）array('key'=>'val')
	 */
	public function groupSync($userId, $data = array()){
		try {
			if(empty($userId))
				throw new Exception('被同步群信息的用户Id不能为空');
			
			if(empty($data))
				throw new Exception('该用户的群信息不能为空');
		
			$arrKey = array_keys($data);
            $arrVal = array_values($data);
            
            $params = array(
                'userId' => $userId
            );
            foreach ($data as $key => $value) {
                $params['group[' . $key . ']'] = $value;
            }

            $ret = $this->curl('/group/sync', $params);
			
			if(empty($ret))
				throw new Exception('请求失败');
			
			return $ret;
		} catch (Exception $e) {
			//print_r($e->getMessage());
			return false;
		}
	}
	
	/**
	 * 将用户加入指定群组，用户将可以收到该群的消息。
	 * @param $userId 要加入群的用户 Id。（必传）
	 * @param $groupId 要加入的群 Id。（必传）
	 * @param $groupName 要加入的群 Id 对应的名称。（可选）
	 */
	public function groupJoin($userId, $groupId, $groupName){
		try {
			if(empty($userId))
				throw new Exception('被同步群信息的用户Id不能为空');
				
			if(empty($groupId))
				throw new Exception('加入的群Id不能为空');
		
			if(empty($groupName))
				throw new Exception('加入的群Id对应的名称不能为空');
				
			$ret = $this->curl('/group/join',array('userId'=>$userId, 'groupId'=>$groupId, 'groupName'=> $groupName));
		
			if(empty($ret))
				throw new Exception('请求失败');
		
			return $ret;
		} catch (Exception $e) {
			//print_r($e->getMessage());
			return false;
		}
	}
	
	/**
	 * 将用户从群中移除，不再接收该群组的消息。
	 * @param $userId 要退出群的用户 Id。（必传）
	 * @param $groupId 要退出的群 Id。（必传）
	 */
	public function groupQuit($userId,$groupId){
		try {
			if(empty($userId))
				throw new Exception('被同步群信息的用户Id不能为空');
			
			if(empty($groupId))
				throw new Exception('加入的群Id不能为空');
			
			$ret = $this->curl('/group/quit',array('userId'=>$userId, 'groupId'=>$groupId));
				
			if(empty($ret))
				throw new Exception('请求失败');
				
			return $ret;
		} catch (Exception $e) {
			//print_r($e->getMessage());
			return false;
		}
	}
	
	/**
	 * 解散群组 方法  将该群解散，所有用户都无法再接收该群的消息
	 * @param $userId 操作解散群的用户 Id。（必传）
	 * @param $groupId 要解散的群 Id。（必传）
	 */
	public function groupDismiss($userId, $groupId){
		try {
			if(empty($userId))
				throw new Exception('操作解散群的用户Id不能为空');
			
			if(empty($groupId))
				throw new Exception('要解散的群Id不能为空');
		
			$ret = $this->curl('/group/dismiss',array('userId'=>$userId, 'groupId'=>$groupId));
			
			if(empty($ret))
				throw new Exception('请求失败');
			
			return $ret;
		} catch (Exception $e) {
			//print_r($e->getMessage());
			return false;
		}
	}

	/**
	 * 刷新群组信息
	 * @param  [type] $groupId   [description]
	 * @param  [type] $groupName [description]
	 * @return [type]            [description]
	 */
	public function groupRefresh($groupId, $groupName){
		try {
			if(empty($groupId))
				throw new Exception('要刷新的群Id不能为空');
			
			if(empty($groupName))
				throw new Exception('要刷新的群Id对应的名称不能为空');
				
			$ret = $this->curl('/group/refresh',array('groupId'=>$groupId, 'groupName'=> $groupName));
		
			if(empty($ret))
				throw new Exception('请求失败');
		
			return $ret;
		} catch (Exception $e) {
			//print_r($e->getMessage());
			return false;
		}
	}
	
	/**
	 * 创建群组，并将用户加入该群组，用户将可以收到该群的消息。注：其实本方法是加入群组方法 /group/join 的别名。
	 * @param $userId 要加入群的用户 Id。（必传）
	 * @param $groupId 要加入的群 Id。（必传）
	 * @param $groupName 要加入的群 Id 对应的名称。（可选）
	 */
	public function groupCreate($userId, $groupId, $groupName){
		try {
			if(empty($userId))
				throw new Exception('要加入群的用户Id不能为空');
		
			if(empty($groupId))
				throw new Exception('要加入群Id不能为空');
			
			if(empty($groupName))
				throw new Exception('要加入群Id对应的名称不能为空');
				
			$ret = $this->curl('/group/create',array('userId'=>$userId, 'groupId'=>$groupId, 'groupName'=> $groupName));
		
			if(empty($ret))
				throw new Exception('请求失败');
		
			return $ret;
		} catch (Exception $e) {
			//print_r($e->getMessage());
			return false;
		}
	}
	
	/**
	 * 创建聊天室
	 * @param unknown $data key:要创建的聊天室的id；val:要创建的聊天室的name。（必传）
	 */
	public function chatroomCreate($data = array()){
		try {
			if(empty($data))
				throw new Exception('要加入群的用户Id不能为空');
		
			$params = array();
			
			foreach ($data as $key=>$val){
				$k = 'chatroom[' . $key . ']';
				$params["$k"] = $val;
			}
			
			$ret = $this->curl('/chatroom/create',$params);
		
			if(empty($ret))
				throw new Exception('请求失败');
		
			return $ret;
		} catch (Exception $e) {
			//print_r($e->getMessage());
			return false;
		}
	}
	
	/**
	 * 销毁聊天室
	 * @param unknown $chatroomId 要销毁的聊天室 Id。（必传）
	 */
	public function chatroomDestroy($chatroomId){
		try {
			if(empty($chatroomId))
				throw new Exception('要销毁的聊天室Id不能为空');
		
			$ret = $this->curl('/chatroom/destroy',array('chatroomId'=>$chatroomId));
		
			if(empty($ret))
				throw new Exception('请求失败');
		
			return $ret;
		} catch (Exception $e) {
			//print_r($e->getMessage());
			return false;
		}
	}
	
	/**
	 * 
	 * @param unknown $chatroomId 要查询的聊天室id（必传）
	 */
	public function chatroomQuery($chatroomId){
		try {
			if(empty($chatroomId))
				throw new Exception('要查询的聊天室Id不能为空');
				
			$ret = $this->curl('/chatroom/query',array('chatroomId'=>$chatroomId));
		
			if(empty($ret))
				throw new Exception('请求失败');
		
			return $ret;
		} catch (Exception $e) {
			//print_r($e->getMessage());
			return false;
		}
	}
	
	/**
	 * 检查用户在线状态 方法
	 * @param unknown $userId 用户 Id。（必传）
	 */
	public function userCheckOnline($userId){
		try {
			if(empty($userId))
				throw new Exception('用户Id不能为空');
			
			$ret = $this->curl('/user/checkOnline',array('userId'=>$userId));
				
			if(empty($ret))
				throw new Exception('请求失败');
				
			return $ret;
		} catch (Exception $e) {
			//print_r($e->getMessage());
			return false;
		}
	}
	
	/**
	 * 封禁用户 方法
	 * @param unknown $userId 用户 Id。（必传）
	 * @param unknown $minute 封禁时长,单位为分钟，最大值为43200分钟。（必传）
	 */
	public function userBlock($userId, $minute){
		try {
			if(empty($userId))
				throw new Exception('用户Id不能为空');
			
			if(empty($minute))
				throw new Exception('封禁时长不能为空');
		
			$ret = $this->curl('/user/block',array('userId'=>$userId,'minute'=>$minute));
			
			if(empty($ret))
				throw new Exception('请求失败');
			
			return $ret;
		} catch (Exception $e) {
			//print_r($e->getMessage());
			return false;
		}
	}
	
	/**
	 * 解除用户封禁 方法
	 * @param unknown $userId 用户 Id。（必传）
	 */
	public function userUnBlock($userId){
		try {
		
			if(empty($userId))
				throw new Exception('用户Id不能为空');
		
			$ret = $this->curl('/user/unblock',array('userId'=>$userId));
				
			if(empty($ret))
				throw new Exception('请求失败');
				
			return $ret;
		} catch (Exception $e) {
			//print_r($e->getMessage());
			return false;
		}
	}
	
	/**
	 * 获取被封禁用户 方法
	 */
	public function userBlockQuery(){
		try {
			
			$ret = $this->curl('/user/block/query','');
			
			if(empty($ret))
				throw new Exception('请求失败');
			
			return $ret;
		} catch (Exception $e) {
			//print_r($e->getMessage());
			return false;
		}
	}
	
	/**
	 * 
	 * @param $userId 用户 Id，最大长度 32 字节。是用户在 App 中的唯一标识码，必须保证在同一个 App 内不重复，重复的用户 Id 将被当作是同一用户。（必传）
	 * @param $name 用户名称，最大长度 128 字节。用来在 Push 推送时，或者客户端没有提供用户信息时，显示用户的名称。
	 * @param $portraitUri 用户头像 URI，最大长度 1024 字节
	 */
	public function userRefresh($userId, $name = '', $portraitUri = ''){
		try {
			if(empty($userId))
				throw new Exception('用户Id不能为空');
			if(empty($name))
				throw new Exception('用户名称不能为空');
			if(empty($portraitUri))
				throw new Exception('用户头像URI不能为空');
			
			$ret = $this->curl('/user/refresh',array('userId' => $userId,'name' => $name, 'portraitUri' => $portraitUri));
				
			if(empty($ret))
				throw new Exception('请求失败');
			
			return $ret;
		} catch (Exception $e) {
			//print_r($e->getMessage());
			return false;
		}
	}
	
	/**
	 * 添加用户到黑名单
	 * @param $userId 用户 Id。（必传）
	 * @param $blackUserId 被加黑的用户Id。(必传)
	 */
	public function userBlacklistAdd($userId, $blackUserId = array()){
		try {
			
			if(empty($userId))
				throw new Exception('用户Id不能为空');
			
			if(empty($blackUserId))
				throw new Exception('被加黑的用户Id不能为空');
			
			$params = array(
				'userId' => $userId
			);
			
			$paramsString = http_build_query($params);
			
			foreach ($blackUserId as $val){
				$paramsString .= "&blackUserId=" . $val;
			}
			
			$ret = $this->curl('/user/blacklist/add',$paramsString);
			
			if(empty($ret))
				throw new Exception('请求失败');
			
			return $ret;
		} catch (Exception $e) {
			//print_r($e->getMessage());
			return false;
		}
	}
	
	/**
	 * 获取某个用户的黑名单列表
	 * @param $userId 用户 Id。（必传）
	 */
	public function userBlacklistQuery($userId){
		try {
			if(empty($userId))
				throw new Exception('用户Id不能为空');
			
			$ret = $this->curl('/user/blacklist/query',array('userId' => $userId));
			
			if(empty($ret))
				throw new Exception('请求失败');
			
			return $ret;
		} catch (Exception $e) {
			//print_r($e->getMessage());
			return false;
		}
	}
	
	/**
	 * 从黑名单中移除用户
	 * @param $userId 用户 Id。（必传）
	 * @param $blackUserId 被移除的用户Id。(必传)
	 */
	public function userBlacklistRemove($userId, $blackUserId = array()){
		try {
			
			if(empty($userId)) 
				throw new Exception('用户Id不能为空');
			
			if(empty($blackUserId))
				throw new Exception('被移除的用户 Id 不能为空');
			
			$params = array(
				'userId' => $userId,
			);
			
			$paramsString = http_build_query($params);
			
			foreach ($blackUserId as $val){
				$paramsString .= "&blackUserId=".$val;
			}
			
			$ret = $this->curl('/user/blacklist/remove', $paramsString);
			
			if(empty($ret))
				throw new Exception('请求失败');
			
			return $ret;
		} catch (Exception $e) {
			//print_r($e->getMessage());
			return false;
		}
	}

	/**
	 * 添加用户到白名单
	 * @param $chatroomId 聊天室 Id。（必传）
	 * @param $userId 被加的用户Id。(必传)
	 */
	public function userWhiteListAdd($chatroomId, $userId = array()){
		try {

			if(empty($chatroomId))
				throw new Exception('聊天室Id不能为空');

			if(empty($userId))
				throw new Exception('添加的用户Id不能为空');

			$params = array(
					'chatroomId' => $chatroomId
			);

			$paramsString = http_build_query($params);

			foreach ($userId as $val){
				$paramsString .= "&userId=" . $val;
			}

			$ret = $this->curl('/chatroom/user/whitelist/add',$paramsString);

			if(empty($ret))
				throw new Exception('请求失败');

			return $ret;
		} catch (Exception $e) {
			//print_r($e->getMessage());
			return false;
		}
	}

	/**
	 * 查询聊天室内用户 方法
	 * @param $chatroomId 聊天室 Id。（必传）
	 * @param $count 要获取的聊天室成员数，上限为 500 ，超过 500 时最多返回 500 个成员（必传）
	 * @param $order 加入聊天室的先后顺序， 1 为加入时间正序， 2 为加入时间倒序（必传）
	 */
	public function chatroomUserQuery($chatroomId, $count=20, $order=2){
		try {

			if(empty($chatroomId))
				throw new Exception('聊天室Id不能为空');

			$params = array(
					'chatroomId' => $chatroomId,
					'count'=>$count,
					'order'=>$order
			);

			$paramsString = http_build_query($params);
			$ret = $this->curl('/chatroom/user/query',$paramsString);

			if(empty($ret))
				throw new Exception('请求失败');

			return $ret;
		} catch (Exception $e) {
			//print_r($e->getMessage());
			return false;
		}
	}

	/**
	 * 添加禁言聊天室成员
	 * @param $chatroomId 聊天室 Id。（必传）
	 * @param $userId 被加的用户Id。(必传)
	 * @param $minute 禁言时长，以分钟为单位，最大值为43200分钟。（必传）
	 */
	public function chatroomUserGagAdd($chatroomId, $userId, $minute){
		try {

			if(empty($chatroomId))
				throw new Exception('聊天室Id不能为空');

			if(empty($userId))
				throw new Exception('添加的用户Id不能为空');

			if(empty($minute))
				throw new Exception('禁言时间不能为空');

			$params = array(
					'chatroomId' => $chatroomId,
					'userId'     => $userId,
					'minute'     =>$minute
			);

			$paramsString = http_build_query($params);
			$ret = $this->curl('/chatroom/user/gag/add',$paramsString);

			if(empty($ret))
				throw new Exception('请求失败');

			return $ret;
		} catch (Exception $e) {
			//print_r($e->getMessage());
			return false;
		}
	}

	/**
	 * 移除禁言聊天室成员
	 * @param $chatroomId 聊天室 Id。（必传）
	 * @param $userId 被加的用户Id。(必传)
	 * @param $minute 禁言时长，以分钟为单位，最大值为43200分钟。（必传）
	 */
	public function chatroomUserGagRollback($chatroomId, $userId){
		try {

			if(empty($chatroomId))
				throw new Exception('聊天室Id不能为空');

			if(empty($userId))
				throw new Exception('添加的用户Id不能为空');
			$params = array(
					'chatroomId' => $chatroomId,
					'userId'     => $userId
			);

			$paramsString = http_build_query($params);
			$ret = $this->curl('/chatroom/user/gag/rollback',$paramsString);

			if(empty($ret))
				throw new Exception('请求失败');

			return $ret;
		} catch (Exception $e) {
			//print_r($e->getMessage());
			return false;
		}
	}


	/**
	 * 创建http header参数
	 * @return multitype:string
	 */
	public function createHttpHeader(){
		$nonce = mt_rand();
		$timeStamp = time();
		$sign = sha1($this->appSecret.$nonce.$timeStamp);
		return array(
				'RC-App-Key:'.$this->appKey,
				'RC-Nonce:'.$nonce,
				'RC-Timestamp:'.$timeStamp,
				'RC-Signature:'.$sign,
		);
	}
	
	/**
	 * 发起 server 请求
	 * @param $action
	 * @param $params
	 * @return 
	 */
	public function curl($action,$params){
		$action = self::SERVERAPIURL.$action.'.'.$this->format;
		$httpHeader = $this->createHttpHeader();
		$ch = curl_init();
		curl_setopt($ch, CURLOPT_URL, $action);
		curl_setopt($ch, CURLOPT_POST, 1);
		curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
		curl_setopt($ch, CURLOPT_HTTPHEADER, $httpHeader);
		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,false); //处理http证书问题
		curl_setopt($ch, CURLOPT_HEADER, false);
		curl_setopt($ch, CURLOPT_TIMEOUT, 30);
		curl_setopt($ch, CURLOPT_DNS_USE_GLOBAL_CACHE, false);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
		$ret = curl_exec($ch);
		if (false === $ret) {
			$ret =  curl_errno($ch);
		}
		curl_close($ch);
		return $ret;
	}
}